package com.gitee.qdbp.general.common.api.sequence.model;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 复杂序列号规则
 *
 * @author zhaohuihua
 * @version 170930
 */
public class StrongSequenceRule implements Serializable {

    /** 版本序列号 **/
    private static final long serialVersionUID = 1L;

    /** 名称 **/
    private String name;

    /** 前缀 **/
    private String prefix;

    /** 时间部分的格式 **/
    private String timeFormat;

    /** 序号的位数(不含时间部分) **/
    private Integer digitNumber;

    /** 初始值(0表示随机初始值, 大于0表示指定初始值) **/
    private Long initValue;

    /** 当前值 **/
    private Long currValue;

    /** 当前的时间部分 **/
    private String currTime;

    /** 是否每个时间段重新开始 **/
    private Boolean round;

    public StrongSequenceRule() {
    }

    public StrongSequenceRule(String timeFormat, int digitNumber) {
        long initValue = 0L; // 随机初始值
        this.setPrefix(null);
        this.setTimeFormat(timeFormat, true);
        this.setDigitNumber(digitNumber);
        this.setInitValue(initValue);
        this.setCurrValue(initValue);
        this.setRound(false);
    }

    /** 获取名称 **/
    public String getName() {
        return name;
    }

    /** 设置名称 **/
    public void setName(String name) {
        this.name = name;
    }

    /** 获取前缀 **/
    public String getPrefix() {
        return prefix;
    }

    /** 设置前缀 **/
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    /** 获取时间部分的格式 **/
    public String getTimeFormat() {
        return timeFormat;
    }

    /** 设置时间部分的格式 **/
    public void setTimeFormat(String timeFormat) {
        this.timeFormat = timeFormat;
    }

    /** 设置时间部分的格式 **/
    public void setTimeFormat(String timeFormat, boolean resetCurrTime) {
        this.timeFormat = timeFormat;
        if (resetCurrTime) {
            SimpleDateFormat sdf = new SimpleDateFormat(timeFormat);
            String currTime = sdf.format(new Date());
            this.setCurrTime(currTime);
        }
    }

    /** 获取序号的位数(不含时间部分) **/
    public Integer getDigitNumber() {
        return digitNumber;
    }

    /** 设置序号的位数(不含时间部分) **/
    public void setDigitNumber(Integer digitNumber) {
        this.digitNumber = digitNumber;
    }

    /** 获取初始值(0表示随机初始值, 大于0表示指定初始值) **/
    public Long getInitValue() {
        return initValue;
    }

    /** 设置初始值(0表示随机初始值, 大于0表示指定初始值) **/
    public void setInitValue(Long initValue) {
        this.initValue = initValue;
    }

    /** 获取当前值 **/
    public Long getCurrValue() {
        return currValue;
    }

    /** 设置当前值 **/
    public void setCurrValue(Long currValue) {
        this.currValue = currValue;
    }

    /** 获取当前的时间部分 **/
    public String getCurrTime() {
        return currTime;
    }

    /** 当前的时间部分 **/
    public void setCurrTime(String currTime) {
        this.currTime = currTime;
    }

    /** 获取是否每个时间段重新开始 **/
    public Boolean getRound() {
        return round;
    }

    /** 设置是否每个时间段重新开始 **/
    public void setRound(Boolean round) {
        this.round = round;
    }

    /**
     * 将当前对象转换为子类对象
     *
     * @param clazz 目标类型
     * @return 目标对象
     */
    public <T extends StrongSequenceRule> T to(Class<T> clazz) {
        T instance;
        try {
            instance = clazz.newInstance();
        } catch (Exception e) {
            throw new IllegalArgumentException("Failed to create " + clazz.getSimpleName() + " instance.", e);
        }

        instance.setName(this.getName()); // 名称
        instance.setPrefix(this.getPrefix()); // 前缀
        instance.setTimeFormat(this.getTimeFormat()); // 时间部分的格式
        instance.setDigitNumber(this.getDigitNumber()); // 序号的位数(不含时间部分)
        instance.setInitValue(this.getInitValue()); // 初始值(0表示随机初始值, 大于0表示指定初始值)
        instance.setCurrValue(this.getCurrValue()); // 当前值
        instance.setCurrTime(this.getCurrTime()); // 当前的时间部分
        instance.setRound(this.getRound()); // 是否每个时间段重新开始
        return instance;
    }

}
